﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using PlaylistGenEngine.VOs;
using System.Collections;
using System.IO;

namespace PlaylistGenEngine.GeradorDeArquivo
{
    public class GeraArquivo
    {
        private Random random = new Random();
        private Hashtable pastasDeArquivos;

        public GeraArquivo(List<Pasta> pastasGrade)
        {
            registraPastas(pastasGrade);
        }

        private void registraPastas(List<Pasta> pastas)
        {
            pastasDeArquivos = new Hashtable();
            foreach (Pasta pasta in pastas)
            {
                if (!pastasDeArquivos.ContainsKey(pasta))
                {
                    List<String> arquivos = recuperaArquivos(pasta);
                    pastasDeArquivos.Add(pasta, arquivos);
                }
            }
        }

        private List<String> recuperaArquivos(Pasta pasta)
        {
            List<String> arquivos = new List<String>();
            foreach (String arquivo in Directory.GetFiles(pasta.FolderPath))
            {
                arquivos.Add(arquivo);
            }
            return arquivos;
        }

        private String getArquivo(Pasta pasta)
        {
            String arquivo = "";
            List<String> arquivos = (List<String>)pastasDeArquivos[pasta];
            if (arquivos.Count > 0)
            {
                arquivo = arquivos[random.Next(0, arquivos.Count - 1)];
                if (pasta.Tipo.Equals(TipoPasta.MUSICA))
                {
                    arquivos.Remove(arquivo);
                }
            }
            else
            {
                pastasDeArquivos.Remove(pasta);
                pastasDeArquivos.Add(pasta, recuperaArquivos(pasta));
                arquivo = getArquivo(pasta);
            }
            return arquivo;
        }

        public void geraArquivo(List<Pasta> pastasGrade, String filePath, int qtdeBlocos)
        {
            StreamWriter sw = new StreamWriter(
                filePath, false, Encoding.GetEncoding("ISO-8859-9"));
            geraInicioArquivo(sw);
            for (int count = 0; count < qtdeBlocos; count++)
            {
                foreach (Pasta pasta in pastasGrade)
                {
                    adicionaNoArquivo(sw, getArquivo(pasta), count+1);
                }
            }
            sw.Flush();
            sw.Close();
        }

        private void geraInicioArquivo(StreamWriter sw)
        {
            sw.WriteLine("#EXTM3U");
            sw.WriteLine("");
        }

        private void adicionaNoArquivo(StreamWriter sw, String filePath, int numBloco)
        {
            sw.WriteLine("#NUM_BLOCO: " + numBloco.ToString());
            sw.WriteLine("#EXTINF:0," + Path.GetFileNameWithoutExtension(filePath));
            sw.WriteLine(filePath);
            sw.WriteLine("");
        }

    }
}
